package com.dbh.jdk8.optional;

import java.util.NoSuchElementException;
import java.util.Optional;

/**
 * optional
 * @author dongbanghui
 * @create 2022/6/24
 */
public class Demo1 {

    public static void main(String[] args) {

        //调用工厂方法创建Optional实例
        Optional<String> name = Optional.of("Sanaulla");
        //传入参数为null，抛出NullPointerException.
//        Optional<String> someNull = Optional.of(null);
        //下面创建了一个不包含任何值的Optional实例
        //例如，值为'null'
        Optional empty = Optional.ofNullable(null);

        //isPresent方法用来检查Optional实例中是否包含值
        //在Optional实例内调用get()返回已存在的值
        name.ifPresent(System.out::println);



        //执行下面的代码会输出: No value present
        try {
            //在空的Optional实例上调用get()，抛出NoSuchElementException
            System.out.println(empty.get());
        } catch (NoSuchElementException ex) {
            System.out.println(ex.getMessage());
        }

        //ifPresent方法接受lambda表达式作为参数。
        //lambda表达式对Optional的值调用consumer进行处理。
        name.ifPresent((value) -> {
            System.out.println("The length of the value is: " + value.length());
        });

        //如果值不为null，orElse方法返回Optional实例的值。
        //如果为null，返回传入的消息。
        //输出: There is no value present!
        System.out.println(empty.orElse("There is no value present!"));
        //输出: Sanaulla
        System.out.println(name.orElse("There is some value!"));

        //orElseGet与orElse方法类似，区别在于orElse传入的是默认值，
        //orElseGet可以接受一个lambda表达式生成默认值。
        //输出: Default Value
        System.out.println(empty.orElseGet(() -> "Default Value"));
        //输出: Sanaulla
        System.out.println(name.orElseGet(() -> "Default Value"));

        try {
            //orElseThrow与orElse方法类似。与返回默认值不同，
            //orElseThrow会抛出lambda表达式或方法生成的异常

        } catch (Throwable ex) {
            //输出: No value present in the Optional instance
            System.out.println(ex.getMessage());
        }


    }


}
